    @staticmethod
    def calculate_moving_average(data: pd.DataFrame, window: int) -> pd.Series:
        """
        计算移动平均线
        """
        return data['close'].rolling(window=window).mean()

    @staticmethod
    def calculate_rsi(data: pd.DataFrame, window: int = 14) -> pd.Series:
        """
        计算相对强弱指数 (RSI)
        """
        delta = data['close'].diff()
        gain = (delta.where(delta > 0, 0)).rolling(window=window).mean()
        loss = (-delta.where(delta < 0, 0)).rolling(window=window).mean()
        rs = gain / loss
        return 100 - (100 / (1 + rs))

    @staticmethod
    def calculate_bollinger_bands(data: pd.DataFrame, window: int = 20):
        """
        计算布林带
        """
        sma = data['close'].rolling(window=window).mean()
        std = data['close'].rolling(window=window).std()
        upper_band = sma + (std * 2)
        lower_band = sma - (std * 2)
        return sma, upper_band, lower_band

"""
基于 AutoGen 的股票分析工具集
"""
import sys
import os
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from service.news_kimi_das import get_sina_finance_news
from service.tushare_pool import getDayStock
from datetime import datetime, timedelta
import json
from colorama import Fore, Style
from typing import Dict, Any, Optional
import pandas as pd


class StockTools:
    """股票分析工具集"""
    
    @staticmethod
    def get_stock_data(stock_code: str, days: int = 365) -> str:
        """
        获取股票历史数据
        
        Args:
            stock_code: 股票代码，如 600519.SH
            days: 获取历史数据的天数，默认365天
            
        Returns:
            股票数据报告字符串
        """
        try:
            print(Fore.CYAN + f"[StockTools] 正在获取股票 {stock_code} 的数据...")
            
            today = datetime.now()
            start_date = (today - timedelta(days=days)).strftime("%Y%m%d")
            end_date = today.strftime("%Y%m%d")
            
            daily_k_data = getDayStock(
                stockCode=stock_code, 
                startDate=start_date, 
                endDate=end_date
            )
            
            if daily_k_data is None or daily_k_data.empty:
                return f"错误：无法获取股票代码 {stock_code} 的数据"
            
            # 获取基本统计信息
            latest_data = daily_k_data.head(10)
            stats = {
                "最新收盘价": float(daily_k_data.iloc[0]["close"]),
                "最高价": float(daily_k_data["high"].max()),
                "最低价": float(daily_k_data["low"].min()),
                "平均成交量": float(daily_k_data["vol"].mean()),
                "平均换手率": float(daily_k_data["turnover_rate"].mean()) if "turnover_rate" in daily_k_data.columns else 0
            }
            
            # 计算涨跌幅
            if len(daily_k_data) > 1:
                price_change = (daily_k_data.iloc[0]["close"] - daily_k_data.iloc[-1]["close"]) / daily_k_data.iloc[-1]["close"] * 100
                stats["期间涨跌幅"] = round(price_change, 2)
            
            result = f"""
股票 {stock_code} 数据报告：
=====================================
统计周期：{start_date} 至 {end_date}
数据条数：{len(daily_k_data)} 条

📊 关键指标：
- 最新收盘价: ¥{stats['最新收盘价']:.2f}
- 区间最高价: ¥{stats['最高价']:.2f}
- 区间最低价: ¥{stats['最低价']:.2f}
- 平均成交量: {stats['平均成交量']:.0f}
- 平均换手率: {stats['平均换手率']:.2f}%
{f"- 期间涨跌幅: {stats['期间涨跌幅']:.2f}%" if '期间涨跌幅' in stats else ''}

📈 最近10个交易日数据：
{latest_data[['trade_date', 'open', 'high', 'low', 'close', 'vol']].to_string()}
"""
            print(Fore.GREEN + "[StockTools] 成功获取股票数据")
            return result
            
        except Exception as e:
            error_msg = f"获取股票数据时出错: {str(e)}"
            print(Fore.RED + f"[StockTools] {error_msg}")
            return error_msg
    
    @staticmethod
    def search_stock_news(stock_code: str, query: Optional[str] = None) -> str:
        """
        搜索股票相关新闻
        
        Args:
            stock_code: 股票代码
            query: 自定义搜索查询
            
        Returns:
            新闻信息字符串
        """
        try:
            if query is None:
                stock_name = StockTools._get_stock_name(stock_code)
                query = f"搜索关于{stock_name}（{stock_code}）的最新财经新闻"
            
            print(Fore.CYAN + f"[StockTools] 开始搜索股票 {stock_code} 的新闻...")
            
            news_result = get_sina_finance_news(query=query)
            
            # 尝试解析JSON格式的新闻数据
            try:
                news_data = json.loads(news_result)
                if isinstance(news_data, dict) and "news_list" in news_data:
                    news_list = news_data["news_list"]
                    print(Fore.GREEN + f"[StockTools] 获取到 {len(news_list)} 条新闻")
                    
                    formatted_news = f"""
股票 {stock_code} 相关新闻：
=====================================
获取时间：{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}
新闻数量：{len(news_list)} 条

📰 最新资讯：
"""
                    
                    for idx, news in enumerate(news_list[:5], 1):
                        formatted_news += f"""
【{idx}】 {news.get('title', '无标题')}
时间：{news.get('time', '未知')}
来源：{news.get('source', '未知')}
摘要：{news.get('content', '无内容')[:200]}...
{'-' * 50}
"""
                    
                    return formatted_news
                else:
                    return f"关于 {stock_code} 的最新新闻：\n{news_result[:2000]}"
                    
            except json.JSONDecodeError:
                return f"关于 {stock_code} 的最新新闻：\n{news_result[:2000]}"
            
        except Exception as e:
            error_msg = f"搜索新闻时出错: {str(e)}"
            print(Fore.RED + f"[StockTools] {error_msg}")
            return error_msg
    
    @staticmethod
    def analyze_stock_data(stock_code: str, stock_data: str, analysis_type: str = "comprehensive") -> str:
        """
        分析股票数据
        
        Args:
            stock_data: 股票数据字符串
            analysis_type: 分析类型 (technical/fundamental/comprehensive)
            
        Returns:
            分析结果字符串
        """
        try:
            print(Fore.CYAN + f"[StockTools] 开始进行{analysis_type}分析...")
            
            # 执行技术分析
            data_df = getDayStock(stock_code, days=365) # or however you get the dataframe
            if data_df is not None and not data_df.empty:
                ma20, upper_band, lower_band = StockTools.calculate_bollinger_bands(data_df)
                rsi = StockTools.calculate_rsi(data_df)
                
                technical_analysis_summary = f"""
                技术指标分析：
                - 布林带 (20日): 上轨 {upper_band.iloc[-1]:.2f}, 中轨 {ma20.iloc[-1]:.2f}, 下轨 {lower_band.iloc[-1]:.2f}
                - RSI (14日): {rsi.iloc[-1]:.2f}
                """
            else:
                technical_analysis_summary = "无法获取足够的数据进行深入技术分析。"
            analysis_result = f"""
股票数据分析报告（{analysis_type}）：
=====================================
分析时间：{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}
分析类型：{analysis_type}

📊 数据概览：
{stock_data[:500] if len(stock_data) > 500 else stock_data}

📈 分析结果：
1. 趋势分析：
   - 短期趋势：根据最近数据判断市场短期走势
   - 中期趋势：基于历史数据分析中期方向
   
2. 技术指标：
   - 移动平均：需计算MA5、MA10、MA20等
   - 成交量：成交量变化反映市场活跃度
   
3. 风险评估：
   - 波动性：价格波动幅度分析
   - 流动性：成交量和换手率评估
   
4. 投资建议：
   - 基于当前分析，提供初步投资参考
   - 建议进一步关注关键指标变化

⚠️ 风险提示：
- 市场存在不确定性，请谨慎决策
- 建议结合多方面信息综合判断
"""
            print(Fore.GREEN + "[StockTools] 分析完成")
            return analysis_result
            
        except Exception as e:
            error_msg = f"数据分析时出错: {str(e)}"
            print(Fore.RED + f"[StockTools] {error_msg}")
            return error_msg
    
    @staticmethod
    def _get_stock_name(stock_code: str) -> str:
        """根据股票代码获取股票名称"""
        stock_names = {
            "600519.SH": "贵州茅台",
            "000001.SZ": "平安银行",
            "000002.SZ": "万科A",
            "000858.SZ": "五粮液",
            "002415.SZ": "海康威视",
        }
        return stock_names.get(stock_code, stock_code.split('.')[0])
    
    @staticmethod
    def format_analysis_report(data_report: str, news_report: str, analysis: str) -> str:
        """
        格式化完整的分析报告
        
        Args:
            data_report: 数据报告
            news_report: 新闻报告
            analysis: 分析结果
            
        Returns:
            格式化的完整报告
        """
        return f"""
{'=' * 60}
股票综合分析报告
{'=' * 60}

一、市场数据
{'-' * 40}
{data_report}

二、新闻资讯
{'-' * 40}
{news_report}

三、深度分析
{'-' * 40}
{analysis}

四、报告说明
{'-' * 40}
生成时间：{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}
分析框架：AutoGen Multi-Agent System
数据来源：Tushare、财经新闻API

免责声明：本报告仅供参考，不构成投资建议。
{'=' * 60}
"""
